package com.code.test.second.hash;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * 349. 两个数组的交集
 * 力扣题目链接
 * <p>
 * 题意：给定两个数组，编写一个函数来计算它们的交集。
 * <p>
 * 「快乐数」定义为：对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和，然后重复这个过程直到这个数变为 1，也可能是 无限循环 但始终变不到 1。如果 可以变为  1，那么这个数就是快乐数。
 * <p>
 * 如果 n 是快乐数就返回 True ；不是，则返回 False 。
 * <p>
 * 示例：
 * <p>
 * 输入：19
 * 输出：true
 * 解释：
 * 1^2 + 9^2 = 82
 * 8^2 + 2^2 = 68
 * 6^2 + 8^2 = 100
 * 1^2 + 0^2 + 0^2 = 1
 */
public class SCode202 {
    public static void main(String[] args) {

        boolean happy = isHappy(19);
        System.out.println(happy);
    }

    public static boolean isHappy(int n) {
        Set<Integer> record = new HashSet<>();

        while (n != 1 && !record.contains(n)) {
            record.add(n);
            n = getNext(n);
        }
        return n == 1;
    }

    /**
     * 把某个整数 按位置拆解出来，每个位置计算平方，然后把这个结果相加,返回回去
     * 快乐数的逻辑就是，一个数进来不断这么计算，如果最终算出来==1，就是快乐数
     */
    public static int getNext(int n) {
        int ret = 0;
        StringBuilder sb = new StringBuilder();
        while (n > 0) {
            //取模，得出个位数
            int tmp = n % 10;
            ret += tmp * tmp;
            //除10，得出下一个数，比如 123/10=12,12/10=1
            n = n / 10;
            //打印每个计算过程
            sb.append(String.format("%d^2 = %d,", tmp, tmp * tmp));
        }
        System.out.println(sb.toString()+",本次计算="+ret);
        return ret;
    }

}
